package cn.com.bluemoon.daps.sync.service;

import cn.com.bluemoon.daps.sync.base.CompareResult;
import cn.com.bluemoon.daps.sync.base.DevModelCompareResult;
import cn.com.bluemoon.daps.sync.base.ModifyType;
import cn.com.bluemoon.daps.sync.core.sync.GlobalConfig;
import cn.com.bluemoon.daps.sync.vo.dev2model.DatasourceOut;
import cn.com.bluemoon.daps.sync.vo.dev2model.MetaTableOut;
import cn.com.bluemoon.daps.sync.vo.dev2model.Sync2ModelVo;
import reactor.util.function.Tuple2;

import java.util.List;
import java.util.Map;

/**
 * @author Jarod.Kong
 * @date 2021/6/16 17:17
 */
public interface DapDev2ModelSyncService {
    /**
     * 模型id获取对应数据源信息 （转换后）
     *
     * @param modelId 模型id
     * @return 数据源
     */
    DatasourceOut queryDsInfoByModelId(String modelId);

    /**
     * 模型id获取对应数据源信息（原生）
     *
     * @param modelId 模型id
     * @return 数据源
     */
    GlobalConfig.DataSourceAndEnv getDsByModelId(String modelId);

    /**
     * 模型id获取数据源库表列表
     *
     * @param modelId 模id
     * @return 库表列表
     */
    List<MetaTableOut> queryDsTableInfoByModelId(String modelId);

    /**
     * 开发库导入模型-对比结果 + 基于所选的开发库表ok （部分库表vs模型表）
     * 所选的库表对比
     *
     * @param modelId      模型id
     * @param tableNameIds 所选库表名
     * @return 结果集
     */
    List<CompareResult<DevModelCompareResult>> compareDevAndModelTables(String modelId, List<String> tableNameIds);

    /**
     * 开发库导入模型-对比结果 + 基于所选的开发库表ok （部分库表vs模型表）
     * 所选的库表对比
     * +返回表变化报告
     *
     * @param modelId      模型id
     * @param tableNameIds 所选库表名  不是表id
     * @return 结果集
     */
    Tuple2<Map<ModifyType, Integer>, List<CompareResult<DevModelCompareResult>>> compareDevAndModelTablesAndAnalyse(String modelId, List<String> tableNameIds);

    /**
     * 开发库导入模型-对比结果 + 基于所选的开发库表+ 入库 （部分库表vs模型表）
     * 所选的库表对比
     *
     * @param modelId      模型id
     * @param tableNameIds 所选库表名
     * @param selectedGroupId 选择导入到哪个组
     * @return 结果集
     */
    List<CompareResult<DevModelCompareResult>> compareDevAndModelTables2DB(String modelId, List<String> tableNameIds, String selectedGroupId);
    /**
     * 开发库导入模型-对比结果 + 基于所选的开发库表+ 入库 （部分库表vs模型表）
     * 所选的库表对比
     *
     * @param vo 入参
     * @return 结果集
     */
    List<CompareResult<DevModelCompareResult>> compareDevAndModelTables2DB(Sync2ModelVo vo);

    /**
     * 根据模型id进行
     * 开发库导入模型-对比结果 + 基于所选的开发库表+ 入库 （全库表vs模型表）
     * 全库表对比
     *
     * @param modelId 模型id
     * @return 结果集
     */
    List<CompareResult<DevModelCompareResult>> compareDevAndModelTables2DB(String modelId);

    /**
     * 根据模型id进行
     * 开发库导入模型-对比结果 + 基于所选的开发库表+ 不入库 （全库表vs模型表）
     * 全库表对比
     *
     * @param modelId 模型id
     * @return 结果集
     */
    List<CompareResult<DevModelCompareResult>> compareDevAndModelTables(String modelId);
}
